package com.example.authsystem.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;

@Entity
@Table(name = "user_roles", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"user_id", "role_id"})
})
@Schema(
        name = "UserRole",
        description = """
                用户角色关联实体类，维护用户与角色之间的多对多关系。
                        
                关系特性：
                - 一个用户可以拥有多个角色
                - 一个角色可以分配给多个用户
                - 用户-角色组合唯一，避免重复分配
                - 支持动态角色分配和撤销
                
                使用场景：
                - 权限管理：通过角色为用户授权
                - 访问控制：基于角色的访问控制(RBAC)
                - 功能授权：不同角色访问不同功能模块
                - 数据权限：基于角色的数据访问范围
                """,
        example = """
                {
                  "id": 1,
                  "userId": 12345,
                  "roleId": 2
                }
                """
)
public class UserRole {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Schema(
            description = """
                    用户角色关联记录的唯一标识符，系统自动生成。
                                
                    特性：
                    - 主键，自动递增
                    - 用于关联记录的唯一标识
                    - 数据库中唯一，不可重复
                    - 删除角色分配时使用此ID
                    """,
            example = "1",
            accessMode = Schema.AccessMode.READ_ONLY,
            minimum = "1"
    )
    @JsonProperty("id")
    private Long id;

    @Column(name = "user_id", nullable = false)
    @Schema(
            description = """
                    用户ID，指向用户表的外键引用。
                                
                    用途：
                    - 标识角色分配给哪个用户
                    - 与用户表建立关联关系
                    - 用于查询用户的所有角色
                    - 删除用户时需要清理相关角色分配
                                
                    约束：
                    - 不能为空
                    - 必须是有效的用户ID
                    - 与roleId组成唯一约束
                    """,
            example = "12345",
            requiredMode = Schema.RequiredMode.REQUIRED,
            minimum = "1"
    )
    @JsonProperty("userId")
    private Long userId;

    @Column(name = "role_id", nullable = false)
    @Schema(
            description = """
                    角色ID，指向角色表的外键引用。
                                
                    用途：
                    - 标识分配给用户的具体角色
                    - 与角色表建立关联关系
                    - 用于查询角色的所有用户
                    - 删除角色时需要清理相关用户分配
                                
                    约束：
                    - 不能为空
                    - 必须是有效的角色ID
                    - 与userId组成唯一约束
                    """,
            example = "2",
            requiredMode = Schema.RequiredMode.REQUIRED,
            minimum = "1"
    )
    @JsonProperty("roleId")
    private Long roleId;

    // Constructors
    public UserRole() {
    }

    public UserRole(Long userId, Long roleId) {
        this.userId = userId;
        this.roleId = roleId;
    }

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getRoleId() {
        return roleId;
    }

    public void setRoleId(Long roleId) {
        this.roleId = roleId;
    }
}